package cn.iocoder.yudao.framework.business.category.service;

import cn.iocoder.yudao.framework.business.basic.service.*;
import cn.iocoder.yudao.framework.business.category.pojo.form.CategorySaveDTO;
import cn.iocoder.yudao.framework.business.category.pojo.po.CategoryEntity;
import cn.iocoder.yudao.framework.business.category.pojo.vo.CategorySimpleVO;
import cn.iocoder.yudao.framework.business.category.pojo.vo.CategoryVO;
import jakarta.annotation.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;

/**
 * 类目 Service 实现类，由子类继承
 *
 * @author 山野羡民
 */
public interface CategoryService<DO extends CategoryEntity> extends ValidateService<DO>, SimpleDetailService<CategoryVO>, CreateService<CategorySaveDTO>, UpdateService<CategorySaveDTO>, SimpleDeleteService {

    /**
     * 获得指定状态的类目列表
     *
     * @return 类目列表
     */
    List<CategorySimpleVO> getSimpleList();

    /**
     * 获得开启状态的类目列表
     *
     * @return 类目列表
     */
    List<CategoryVO> getAllList();

    /**
     * 获得开启状态的类目列表
     *
     * @param parentId 产品父级分类编号
     * @return 类目列表
     */
    List<CategoryVO> getEnableList(@Nullable Long parentId);

    /**
     * 获得开启状态的类目列表，指定编号
     *
     * @param ids 类目编号数组
     * @return 类目列表
     */
    List<CategoryVO> getList(Collection<Long> ids);

    /**
     * 获得开启状态的类目列表，指定编号
     *
     * @param ids 类目编号数组
     * @return 类目列表
     */
    default Map<Long, CategoryVO> getMap(Collection<Long> ids) {
        return convertMap(getList(ids), CategoryVO::getId);
    }

    /**
     * 获得指定类目的所有后代类目
     *
     * @param parentId 类目编号
     * @param status   启用/关闭
     * @return 子类目列表
     */
    List<CategoryVO> getDescendantList(Long parentId, Integer status);

    /**
     * 获得所有后代类目，从缓存中
     *
     * @param parentId 父类目编号
     * @param status   启用/关闭
     * @return 子类目列表
     */
    Set<Long> getDescendantIdsFromCache(Long parentId, Integer status);

    /**
     * 从缓存根据分类编号获取分类名称
     *
     * @param id 分类编号
     * @return 分类名称
     */
    String getCategoryNameFromCache(Long id);

}
